package ar.uba.fi.algo3.algoTank.model.proyectiles;

import ar.uba.fi.algo3.algoTank.model.Objeto;
import ar.uba.fi.algo3.algoTank.model.Vector;
import ar.uba.fi.algo3.algoTank.model.armas.Arma;
import ar.uba.fi.algo3.algoTank.model.bonus.Bonus;
import ar.uba.fi.algo3.algoTank.model.cuarteles.Cuartel;
import ar.uba.fi.algo3.algoTank.model.escenarios.Escenario;
import ar.uba.fi.algo3.algoTank.model.formas.Rectangulo;
import ar.uba.fi.algo3.algoTank.model.interfaces.Movible;
import ar.uba.fi.algo3.algoTank.model.paredes.Pared;
import ar.uba.fi.algo3.algoTank.model.tanques.Tanque;
import ar.uba.fi.algo3.algoTank.util.Constantes;

public abstract class Proyectil extends Objeto implements Movible {

	public Proyectil() {
		super(new Rectangulo(1, 1, new Vector(0, 0)));
	}

	public abstract float getDanio(Objeto objeto);

	public boolean hayColision(Objeto objeto) {
		if (!this.equals(objeto)) {
			return getForma().hayInterseccion(objeto.getForma());
		}
		else {
			return false;
		}
	}

	public boolean hayColision(Pared pared) {
		if (hayColision((Objeto) pared)) {
			Escenario.getInstancia().quitarObjeto(this);
			colisionar(pared);
			return true;
		}
		else {
			return false;
		}
	}

	public boolean hayColision(Bonus bonus) {
		if (hayColision((Objeto) bonus)) {
			return true;
		}
		else {
			return false;
		}
	}

	public boolean hayColision(Tanque tanque) {
		if (hayColision((Objeto) tanque)) {
			Escenario.getInstancia().quitarObjeto(this);
			colisionar(tanque);
			return true;
		}
		else {
			return false;
		}
	}

	public boolean hayColision(Arma arma) {
		if (hayColision((Objeto) arma)) {
			colisionar(arma);
			return true;
		}
		else {
			return false;
		}
	}

	public boolean hayColision(Proyectil proyectil) {
		if (hayColision((Objeto) proyectil)) {
			Escenario.getInstancia().quitarObjeto(this);
			colisionar(proyectil);
			return true;
		}
		else {
			return false;
		}
	}

	public boolean hayColision(Cuartel cuartel) {
		if (hayColision((Objeto) cuartel)) {
			Escenario.getInstancia().quitarObjeto(this);
			colisionar(cuartel);
			return true;
		}
		else {
			return false;
		}
	}

	public void colisionar(Cuartel cuartel) {
		cuartel.quitarResistencia(cuartel.getResistencia());
	}

	public void colisionar(Pared pared) {
		pared.quitarResistencia(1);
	}

	public void colisionar(Tanque tanque) {
		tanque.quitarResistencia(getDanio(tanque));
	}

	public void colisionar(Arma arma) {

	}

	public void colisionar(Proyectil proyectil) {
		proyectil.quitarResistencia(proyectil.getResistencia());
		quitarResistencia(getResistencia());
	}

	public void mover(Enum<Constantes.direccion> direccion) {

		setDireccion(direccion);

		if (direccion.equals(Constantes.direccion.ARRIBA)) {
			getPosicion().sumarVector(new Vector(0, 1 * Constantes.VELOCIDAD_PROYECTIL));
		}
		else if (direccion.equals(Constantes.direccion.ABAJO)) {
			getPosicion().sumarVector(new Vector(0, -1 * Constantes.VELOCIDAD_PROYECTIL));
		}
		else if (direccion.equals(Constantes.direccion.DERECHA)) {
			getPosicion().sumarVector(new Vector(1 * Constantes.VELOCIDAD_PROYECTIL, 0));
		}
		else if (direccion.equals(Constantes.direccion.IZQUIERDA)) {
			getPosicion().sumarVector(new Vector(-1 * Constantes.VELOCIDAD_PROYECTIL, 0));
		}
	}

	public void vivir() {

	}

}
